home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / setjmp / setjmp.a next >
Text File  |  1994-02-01  |  1KB  |  46 lines

  1.  
  2.         ;   SETJMP.A
  3.         ;
  4.         ;   (c)Copyright 1990-91, Matthew Dillon, All Rights Reserved
  5.         ;
  6.         ;   revised to add current __stk_base
  7.  
  8.         section text,code
  9.  
  10.         xdef    _setjmp
  11.         xdef    _longjmp
  12.         xref    __stk_base
  13.         xref    __CStackFree
  14.         xref    __AbortLockout
  15.  
  16. _setjmp
  17.         move.l    4(sp),A0        ; jmp_buf (16 longwords)
  18.         move.l    (sp),A1         ; return address
  19.         movem.l D2-D7/A1-A7,(A0)
  20.         move.l    __stk_base(A4),52(A0)   ;[4] = current stk base
  21.         moveq.l #0,D0            ; direct call returns 0
  22.         rts
  23.  
  24. _longjmp
  25.         move.w    #0,__AbortLockout(A4)    ; clear abort lockout
  26.         addq.l    #4,sp            ; skip rts
  27.         move.l    (sp)+,A2        ; jmp_buf
  28.         move.l    (sp)+,D2        ; ret-value, disallow 0
  29.         bne    lj0
  30.         moveq.l #1,D2
  31. lj0        move.l    48(A2),A7      ; restore stack immediately
  32.         move.l    52(A2),A3      ; original stack base
  33. lj1        cmp.l    __stk_base(A4),A3
  34.         beq    lj10
  35.         jsr    __CStackFree(pc)    ; free stacks until ok
  36.         bra    lj1
  37. lj10
  38.         move.l    A2,A0            ; restore frame
  39.         move.l    D2,D0
  40.         movem.l (A0),D2-D7/A1-A7
  41.         move.l    A1,(sp)         ; set up return address
  42.         rts
  43.  
  44.         END
  45.  
  46.